<?php
/*
 * 图片操作类（缩略图，水印）
 * 目前支持gd, im(ImageMagick)
 * @author andery <andery@foxmail.com>
 * @link http://www.minophp.com/
 * @version $Id: CImage.lib.php 2010-08-22 12:54:01Z andery $
 */
class CImage
{
    /**
     * 错误代码
     * 1 原始图片不存在
     * 2 原始图片不可读
     * 3 没有指定缩略图
     * 4 缩略图位置不可写
     * 5 获取原始图片信息错误
     */
    private  $_errorcode = 0;
    
    /**
     * 生成缩略图
     * @param string $src 原图
     * @param string $dst 缩略图
     * @param int $thumbwidth 缩略图宽
     * @param int $thumbheight 缩略图高
     * @param string $bgcolor 缩略图背景
     */
    public function make_thumb($src, $dst, $thumb_width = 0, $thumb_height = 0, $bgcolor = '#FFFFFF')
    {
        if (empty($src)) {
            $this->_errorcode = 1;
            return false;
        }
        if (!is_readable($src)) {
            $this->_errorcode = 2;
            return false;
        }
        if (empty($dst)) {
            $this->_errorcode = 3;
            return false;
        }
        $dstpath = dirname($dst);
        if(!is_writable($dstpath)) {
            $this->_errorcode = 4;
            return false;
        }
        
        $imginfo = @getimagesize($src);
        if(!$imginfo) {
            $this->_errorcode = 5;
            return false;
        }
        $src_width = $imginfo[0];
        $src_height = $imginfo[1];
        $src_mime = $imginfo['mime'];
        $src_size = @filesize($src);
        
        switch($src_mime) {
            case 'image/jpeg':
                $imagecreatefromfunc = function_exists('imagecreatefromjpeg') ? 'imagecreatefromjpeg' : '';
                $imagefunc = function_exists('imagejpeg') ? 'imagejpeg' : '';
                $dst .= '.jpg';
                break;
            case 'image/gif':
                $imagecreatefromfunc = function_exists('imagecreatefromgif') ? 'imagecreatefromgif' : '';
                $imagefunc = function_exists('imagegif') ? 'imagegif' : '';
                $dst .= '.gif';
                break;
            case 'image/png':
                $imagecreatefromfunc = function_exists('imagecreatefrompng') ? 'imagecreatefrompng' : '';
                $imagefunc = function_exists('imagepng') ? 'imagepng' : '';
                $dst .= '.png';
                break;
            default:
                $this->_errorcode = 6;
                return false;
                break;
        }
        // 原始图片以及缩略图的尺寸比例
        $scale = $src_width / $src_height;
        
        // 处理只有缩略图宽和高有一个为0的情况，这时背景和缩略图一样大 
        if ($thumb_width == 0) {
            $thumb_width = $thumb_height * $scale;
        }
        if ($thumb_height == 0) {
            $thumb_height = $thumb_width / $scale;
        }
        //创建缩略图标识符
        $img_thumb  = imagecreatetruecolor($thumb_width, $thumb_height);
        $bgcolor = trim($bgcolor,"#");
        sscanf($bgcolor, "%2x%2x%2x", $red, $green, $blue);
        $clr = imagecolorallocate($img_thumb, $red, $green, $blue);
        imagefilledrectangle($img_thumb, 0, 0, $thumb_width, $thumb_height, $clr);

        if ($src_width / $thumb_width > $src_height / $thumb_height) {
            $lessen_width  = $thumb_width;
            $lessen_height  = $thumb_width / $scale;
        } else {
            // 原始图片比较高，则以高度为准 
            $lessen_width  = $thumb_height * $scale;
            $lessen_height = $thumb_height;
        }

        $dst_x = ($thumb_width  - $lessen_width)  / 2;
        $dst_y = ($thumb_height - $lessen_height) / 2;
        
        $img_src = $imagecreatefromfunc($src);
        imagecopyresampled($img_thumb, $img_src, $dst_x, $dst_y, 0, 0, $lessen_width, $lessen_height, $src_width, $src_height);
        
        $imagefunc($img_thumb, $dst);
        imagedestroy($img_thumb);
        imagedestroy($img_src);
        //确认文件是否生成
        if (is_file($dst)) {
            return $dst;
        } else {
            $this->_errorcode = 7;
            return false;
        }
    }
    
    /**
     * 返回错误代码
     */
    public function error()
    {
        return $this->_errorcode;
    }
}